<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of basededatos:
 *  Accesa a la base de datos MySQL
 *
 * @author peregrina
 */


class basededatos {
    public $mysqli;
    protected $ini;

    function conectar($ini){
        $this->mysqli = mysqli_connect($ini["servidor"], $ini["usuario"], $ini["contrasena"], $ini["basededatos"]);
    }

    function __construct() {
        //Obtener la configuración
        
        $this->ini= (file_exists($_SERVER["DOCUMENT_ROOT"]."/objetos/configuracion.ini"))? parse_ini_file($_SERVER["DOCUMENT_ROOT"]."/objetos/configuracion.ini"):array();
        $ini = $this->ini;
        //Si el sistema no está instalado
        if(empty($ini["instalado"]) || isset($_GET["config"]) || isset($_GET["instalar"])){
            $this->instalar($ini);
        }
        //Si si lo está, seguir con la connección.
        else{
            $GLOBALS["nombre_sitio"]=$ini["nombre"];
            $GLOBALS["pie"]=$ini["pie"];
            $GLOBALS["iph"]=(!empty($ini["items_por_hoja"]))?$ini["items_por_hoja"]:0;
            $this->conectar($ini);
            if (mysqli_connect_errno($this->mysqli)) {
                echo "Fallo al contenctar a MySQL: (" . $this->mysqli->connect_errno . ") " . $this->mysqli->connect_error;
            }
            //Checar que estén todos los componentes
            if(!$this->confirmar_instalacion()){
                unlink($_SERVER["DOCUMENT_ROOT"]."/objetos/configuracion.ini");
                $this->redirect("&error=La base de datos si existe pero no tiene contenido");
            }
            
        }
        
    }
    
    function __destruct(){
        if(isset($this->mysqli)){
            @$this->mysqli->close();
        }
    }
        
    
    //Retorna los resultados de la pregunta, false si hubo error.
    function query($query){
        $fila="";
        //if(empty($this->mysqli)){
            $this->conectar($this->ini);
        //}
        $resultado = $this->mysqli->query($query);
        //Si si obtuvimos una respuesta
        if(!empty($resultado)){
            $fila = $resultado->fetch_assoc();
            $resultado->free();
        }
        
        return $fila;
    }
    
    function multiquery($query){
        $res="";
        $resultado = $this->mysqli->query($query);
        while($col = $resultado->fetch_assoc()){
            $res[] = $col;
        }
        $resultado->free();
        return $res;
    }
    
    //Retorna true si el insert, update o alter fueron correctos, false si hubo error.
    function insert($query){
        $ret=true;
        $res = $this->mysqli->query($query);
        $this->mysqli->close();
        if(empty($res)){
            $ret= false;
        }
        return $ret;
        $res->free();
    }
    
    //Instala el sistema
    function instalar($ini){
        //Mostrar la forma para guardar en el archivo
        if(!isset($_GET["instalar"])){
            $ini["nombre"] = (!empty($ini["nombre"]))?$ini["nombre"]:"Peregrina CMS";
            $ini["pie"] = (!empty($ini["pie"]))?$ini["pie"]:"&copy; Luis Antonio Peregrina Andrade";
            $ini["items_por_hoja"] = (!empty($ini["items_por_hoja"]))?$ini["items_por_hoja"]:"20";
            $ini["servidor"] = (!empty($ini["servidor"]))?$ini["servidor"]:"localhost";
            $ini["usuario"] = (!empty($ini["usuario"]))?$ini["usuario"]:"root";
            $ini["contrasena"] = (!empty($ini["contrasena"]))?$ini["contrasena"]:"";
            $ini["basededatos"] = (!empty($ini["basededatos"]))?$ini["basededatos"]:"";
            
            
            $mensaje = (isset($_GET["error"]))?"<div class='error'>Error: ".$_GET["error"].".</div>":"";
            
            $config = (isset($_GET["config"]))?"&config":"";
            $boton = (isset($_GET["config"]))?"Guardar":"Instalar";
            
            echo <<<FIN
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>{$ini["nombre"]}</title>
        <link rel="stylesheet" href="estilo/estilo.css">
    </head>
    <body>
        <div class="menu">Instalación</div>
        <div class="cuerpo" >
            <h1>Instalación</h1><br />$mensaje
            <form method="post" action="?instalar{$config}" style="width: 25em;">
            <h2>Sitio</h2><br />
            Nombre del sitio: <input type="text" name="nombre" value="{$ini["nombre"]}" class="aladerecha"/><br /><br />
            Pie de página: <input type="text" name="pie" value="{$ini["pie"]}" class="aladerecha"/><br /><br />
            Items por hoja: <input type="text" name="items_por_hoja" value="{$ini["items_por_hoja"]}" class="aladerecha"/><br /><br /><br />
            <h2>Base de datos</h2><br />
            
            Servidor: <input type="text" name="servidor" value="{$ini["servidor"]}" class="aladerecha"/><br /><br />
            Usuario: <input type="text" name="usuario" value="{$ini["usuario"]}" class="aladerecha"/><br /><br />
            Contraseña: <input type="password" name="contrasena" value="{$ini["contrasena"]}" class="aladerecha"/><br /><br />
            Nombre de la BDD: <input type="text" name="basededatos" value="{$ini["basededatos"]}" class="aladerecha"/><br /><br />
            <input type="submit" value="$boton"/>
            </form>
            
        </div>
        <div class="pie">{$ini["pie"]}e</div>
        
    </body>
</html>
FIN;
        }
        
        //Guardar la información 
        else{
            //Obtener información
            $nombre = htmlentities($_POST["nombre"], ENT_COMPAT, "UTF-8");
            $iph = htmlentities($_POST["items_por_hoja"], ENT_COMPAT, "UTF-8");
            $pie = htmlentities($_POST["pie"], ENT_COMPAT, "UTF-8");
            $servidor = $_POST["servidor"];
            $usuario = $_POST["usuario"];
            $contrasena = $_POST["contrasena"];
            $basededatos = $_POST["basededatos"];
            
            //Si conectamos hay que grabar la información
            $prueba = new mysqli($servidor, $usuario, $contrasena, $basededatos);
            if ($prueba->connect_error) {
                $this->redirect("config&error=".$prueba->connect_error);
            }
            else{
                //Guardar archivo
                $ini = <<<FIN
[sitio]
nombre="$nombre"\r
pie="$pie"\r
items_por_hoja="$iph"\r
instalado="Si"\r
\r
[bdd]\r
servidor="$servidor"\r
usuario="$usuario"\r
contrasena="$contrasena"\r
basededatos="$basededatos"
FIN;
                $archivo = fopen($_SERVER['DOCUMENT_ROOT']."/objetos/configuracion.ini","w");
                if(!empty($archivo)){
                    fwrite($archivo, $ini);
                    fclose($archivo);
                    //Ejecutar el SQL para crear todo, a menos de que sea la conf
                    if(!isset($_GET["config"])){
                        $sql = file_get_contents($_SERVER['DOCUMENT_ROOT']."/objetos/basededatos.sql");
                        mysqli_multi_query($prueba,$sql);
                        //Limpiar directorio de archivos
                        $this->delTree($_SERVER['DOCUMENT_ROOT']."/archivos/");
                        //Redireccionar, se va a poner la misma página si falló la connección.
                        $this->redirect("uid=aregistrar");
                    }
                    else{
                        $this->redirect("");
                    }
                    
                    
                    //Cerrar la conección
                    mysqli_close($prueba);

                }
                else{
                    //
                    $this->redirect("config&error=No se pudo guardar el archivo");
                }
            }
            
        }
        //Nos aseguramos que nada mas se ejecute
        exit;
    }
    
    function redirect($a){
        header("HTTP/1.0 303 See Other.", true);
        header("Location: ?$a");
    }
    
    //Borrar directorio con archivos
    function delTree($dir) { 
        $files = array_diff(scandir($dir), array('.','..')); 
        foreach ($files as $file) { 
          (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); 
        } 
        return rmdir($dir); 
  } 
  
  //Confirma la instalación
  function confirmar_instalacion(){
      $res = $this->multiquery("show tables;");
      if(!empty($res)){
          return true;
      }
      else{
          return false;
      }
      
  }
}

?>
